<?php
declare (strict_types = 1);

namespace app\logic;
use Predis\Client;

class PredisLogic
{
    public $client;

    // 构造函数，用于初始化连接
    public function __construct()
    {
        // 初始化 Redis 配置 构建连接参数
        $parameters = [
            'host' => env('REDIS.HOST'),
            'port' => env('REDIS.PORT'),
            'scheme' => 'tcp',
        ];
        // 创建 Redis 连接
        if (!empty( env('REDIS.AUTH'))) {
            $parameters['password'] = env('REDIS.AUTH');
        }
        // 创建 Redis 连接
        $this->client = new Client($parameters);
    }

    // 添加 xadd 方法
    public function xadd($stream, $id, array $message)
    {
        return $this->client->xadd($stream, $message);
    }

    // 添加 xinfo 方法
    public function xinfo($operation, $stream, $group = null)
    {
        $args = ['XINFO', $operation, $stream];
        if ($group !== null) {
            $args[] = $group;
        }
        return $this->client->executeRaw($args);
    }

    public function xread(array $streams, $count, $block = 0) {
        $args = [];
        // 添加 COUNT 和 BLOCK 参数
        if ($count > 0) {
            $args[] = 'COUNT';
            $args[] = $count;
        }
        if ($block > 0) {
            $args[] = 'BLOCK';
            $args[] = $block;
        }
        // 添加 STREAMS 关键字
        $args[] = 'STREAMS';
        // 添加 stream 键和对应的 ID
        $keys = array_keys($streams);
        $ids = array_values($streams);
        $args = array_merge($args, $keys, $ids);
        // 构造最终命令
        return $this->client->executeRaw(array_merge(['XREAD'], $args));
    }

    // 添加 xack 方法
    public function xack($stream, $group, $id)
    {
        return $this->client->executeRaw(['XACK', $stream, $group, $id]);
    }

    // 在 PredisLogic 类中添加 xdel 方法
    public function xdel($stream, $id)
    {
        try {
            // 处理单个消息ID或数组
            $ids = is_array($id) ? $id : [$id];
            
            // 构造命令参数
            $args = ['XDEL', $stream];
            $args = array_merge($args, $ids);
            
            // 执行命令
            return $this->client->executeRaw($args);
        } catch (Exception $e) {
            // 记录错误日志
            error_log("删除Stream消息失败: " . $e->getMessage());
            return false;
        }
    }


    // 在 PredisLogic 类中添加创建消费者组的方法
    public function xgroup($operation, $stream, $group, $id = '0', $mkstream = false)
    {
        $args = ['XGROUP', $operation, $stream, $group, $id];
        if ($mkstream) {
            $args[] = 'MKSTREAM';
        }
        return $this->client->executeRaw($args);
    }

    // 在 PredisLogic 中添加 xrange 方法
    public function xrange($stream, $start, $end, $count = null)
    {
        $args = ['XRANGE', $stream, $start, $end];
        if ($count) {
            $args[] = 'COUNT';
            $args[] = $count;
        }
        return $this->client->executeRaw($args);
    }
}